{
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# Tensorflow Linear Regression"
      ],
      "metadata": {}
    },
    {
      "cell_type": "markdown",
      "source": [
        "TensorFlow was created by Google Brain and is used for doing machine learning in neural networks. On the other hand, to use deep learning approaches, you will need large data to train. If not enough data, the model will be overfitting. "
      ],
      "metadata": {}
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import pandas as pd\n",
        "\n",
        "import warnings\n",
        "warnings.filterwarnings(\"ignore\")\n",
        "\n",
        "# fix_yahoo_finance is used to fetch data \n",
        "import fix_yahoo_finance as yf\n",
        "yf.pdr_override()"
      ],
      "outputs": [],
      "execution_count": 1,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# input\n",
        "symbol = 'AMD'\n",
        "start = '2007-01-01'\n",
        "end = '2018-11-01'\n",
        "\n",
        "# Read data \n",
        "dataset = yf.download(symbol,start,end)\n",
        "\n",
        "# View Columns\n",
        "dataset.head()"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[*********************100%***********************]  1 of 1 downloaded\n"
          ]
        },
        {
          "output_type": "execute_result",
          "execution_count": 2,
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Open</th>\n",
              "      <th>High</th>\n",
              "      <th>Low</th>\n",
              "      <th>Close</th>\n",
              "      <th>Adj Close</th>\n",
              "      <th>Volume</th>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>Date</th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>2007-01-03</th>\n",
              "      <td>20.080000</td>\n",
              "      <td>20.400000</td>\n",
              "      <td>19.350000</td>\n",
              "      <td>19.520000</td>\n",
              "      <td>19.520000</td>\n",
              "      <td>28350300</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2007-01-04</th>\n",
              "      <td>19.660000</td>\n",
              "      <td>19.860001</td>\n",
              "      <td>19.320000</td>\n",
              "      <td>19.790001</td>\n",
              "      <td>19.790001</td>\n",
              "      <td>23652500</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2007-01-05</th>\n",
              "      <td>19.540001</td>\n",
              "      <td>19.910000</td>\n",
              "      <td>19.540001</td>\n",
              "      <td>19.709999</td>\n",
              "      <td>19.709999</td>\n",
              "      <td>15902400</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2007-01-08</th>\n",
              "      <td>19.709999</td>\n",
              "      <td>19.860001</td>\n",
              "      <td>19.370001</td>\n",
              "      <td>19.469999</td>\n",
              "      <td>19.469999</td>\n",
              "      <td>15814800</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2007-01-09</th>\n",
              "      <td>19.450001</td>\n",
              "      <td>19.709999</td>\n",
              "      <td>19.370001</td>\n",
              "      <td>19.650000</td>\n",
              "      <td>19.650000</td>\n",
              "      <td>14494200</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                 Open       High        Low      Close  Adj Close    Volume\n",
              "Date                                                                       \n",
              "2007-01-03  20.080000  20.400000  19.350000  19.520000  19.520000  28350300\n",
              "2007-01-04  19.660000  19.860001  19.320000  19.790001  19.790001  23652500\n",
              "2007-01-05  19.540001  19.910000  19.540001  19.709999  19.709999  15902400\n",
              "2007-01-08  19.709999  19.860001  19.370001  19.469999  19.469999  15814800\n",
              "2007-01-09  19.450001  19.709999  19.370001  19.650000  19.650000  14494200"
            ]
          },
          "metadata": {}
        }
      ],
      "execution_count": 2,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset['Increase_Decrease'] = np.where(dataset['Volume'].shift(-1) > dataset['Volume'],1,0)\n",
        "dataset['Buy_Sell_on_Open'] = np.where(dataset['Open'].shift(-1) > dataset['Open'],1,0)\n",
        "dataset['Buy_Sell'] = np.where(dataset['Adj Close'].shift(-1) > dataset['Adj Close'],1,0)\n",
        "dataset['Returns'] = dataset['Adj Close'].pct_change()\n",
        "dataset = dataset.dropna()\n",
        "dataset.head()"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 3,
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Open</th>\n",
              "      <th>High</th>\n",
              "      <th>Low</th>\n",
              "      <th>Close</th>\n",
              "      <th>Adj Close</th>\n",
              "      <th>Volume</th>\n",
              "      <th>Increase_Decrease</th>\n",
              "      <th>Buy_Sell_on_Open</th>\n",
              "      <th>Buy_Sell</th>\n",
              "      <th>Returns</th>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>Date</th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>2007-01-04</th>\n",
              "      <td>19.660000</td>\n",
              "      <td>19.860001</td>\n",
              "      <td>19.320000</td>\n",
              "      <td>19.790001</td>\n",
              "      <td>19.790001</td>\n",
              "      <td>23652500</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.013832</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2007-01-05</th>\n",
              "      <td>19.540001</td>\n",
              "      <td>19.910000</td>\n",
              "      <td>19.540001</td>\n",
              "      <td>19.709999</td>\n",
              "      <td>19.709999</td>\n",
              "      <td>15902400</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>-0.004043</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2007-01-08</th>\n",
              "      <td>19.709999</td>\n",
              "      <td>19.860001</td>\n",
              "      <td>19.370001</td>\n",
              "      <td>19.469999</td>\n",
              "      <td>19.469999</td>\n",
              "      <td>15814800</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>-0.012177</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2007-01-09</th>\n",
              "      <td>19.450001</td>\n",
              "      <td>19.709999</td>\n",
              "      <td>19.370001</td>\n",
              "      <td>19.650000</td>\n",
              "      <td>19.650000</td>\n",
              "      <td>14494200</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0.009245</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2007-01-10</th>\n",
              "      <td>19.639999</td>\n",
              "      <td>20.020000</td>\n",
              "      <td>19.500000</td>\n",
              "      <td>20.010000</td>\n",
              "      <td>20.010000</td>\n",
              "      <td>19783200</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0.018321</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                 Open       High        Low      Close  Adj Close    Volume  \\\n",
              "Date                                                                          \n",
              "2007-01-04  19.660000  19.860001  19.320000  19.790001  19.790001  23652500   \n",
              "2007-01-05  19.540001  19.910000  19.540001  19.709999  19.709999  15902400   \n",
              "2007-01-08  19.709999  19.860001  19.370001  19.469999  19.469999  15814800   \n",
              "2007-01-09  19.450001  19.709999  19.370001  19.650000  19.650000  14494200   \n",
              "2007-01-10  19.639999  20.020000  19.500000  20.010000  20.010000  19783200   \n",
              "\n",
              "            Increase_Decrease  Buy_Sell_on_Open  Buy_Sell   Returns  \n",
              "Date                                                                 \n",
              "2007-01-04                  0                 0         0  0.013832  \n",
              "2007-01-05                  0                 1         0 -0.004043  \n",
              "2007-01-08                  0                 0         1 -0.012177  \n",
              "2007-01-09                  1                 1         1  0.009245  \n",
              "2007-01-10                  1                 1         1  0.018321  "
            ]
          },
          "metadata": {}
        }
      ],
      "execution_count": 3,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset.shape"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 4,
          "data": {
            "text/plain": [
              "(2980, 10)"
            ]
          },
          "metadata": {}
        }
      ],
      "execution_count": 4,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import tensorflow as tf\n",
        "\n",
        "import numpy as np\n",
        "\nprint(tf.__version__)"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "1.9.0\n"
          ]
        }
      ],
      "execution_count": 5,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "X = dataset[['Open', 'High', 'Low', 'Volume', 'Returns']]\n",
        "Y = dataset['Adj Close']"
      ],
      "outputs": [],
      "execution_count": 33,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "batch_size = 32\n",
        "learning_rate = 0.003\n",
        "n_epoches = 6000"
      ],
      "outputs": [],
      "execution_count": 30,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# splitting the data into train and test dataframes \n",
        "train_d = X.sample(frac=0.7, random_state=101)\n",
        "test_d = X.drop(train_d.index)"
      ],
      "outputs": [],
      "execution_count": 22,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# converting train and test dataframes to matices to creat datasets\n",
        "train_d = train_d.astype('float32').as_matrix()\n",
        "test_d = test_d.astype('float32').as_matrix()"
      ],
      "outputs": [],
      "execution_count": 26,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "training_set = tf.data.Dataset.from_tensor_slices((train_d[:,0], train_d[:,1]))\n",
        "testing_set = tf.data.Dataset.from_tensor_slices((test_d[:,0], test_d[:,1]))"
      ],
      "outputs": [],
      "execution_count": 27,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# combining consecutive elements of the train dataset into batches\n",
        "training_set = training_set.batch(batch_size)"
      ],
      "outputs": [],
      "execution_count": 31,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# creating an (uninitialized) iterator for enumerating the elements of the dataset with the given structure\n",
        "iterator = tf.data.Iterator.from_structure(training_set.output_types, training_set.output_shapes)\n",
        "train_init = iterator.make_initializer(training_set)"
      ],
      "outputs": [],
      "execution_count": 32,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# get_next() returns a nested structure of `tf.Tensor`s containing the next element\n",
        "X, Y = iterator.get_next()"
      ],
      "outputs": [],
      "execution_count": 34,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def R_squared(y, y_pred):\n",
        "    '''\n",
        "    R_squared computes the coefficient of determination.\n",
        "    It is a measure of how well the observed outcomes are replicated by the model.\n",
        "    '''\n",
        "    residual = tf.reduce_sum(tf.square(tf.subtract(y, y_pred)))\n",
        "    total = tf.reduce_sum(tf.square(tf.subtract(y, tf.reduce_mean(y))))\n",
        "    r2 = tf.subtract(1.0, tf.div(residual, total))\n",
        "    return r2"
      ],
      "outputs": [],
      "execution_count": 35,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Model\n",
        "w = tf.Variable(tf.truncated_normal((1,), mean=0, stddev=0.1, seed=123), name='Weight')\n",
        "b = tf.Variable(tf.constant(0.1), name='Bias')\n",
        "y_pred = tf.multiply(w, X) + b"
      ],
      "outputs": [],
      "execution_count": 36,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Cost function\n",
        "loss = tf.reduce_mean(tf.square(Y - y_pred), name='Loss')\n",
        "        \n",
        "# training\n",
        "optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss)"
      ],
      "outputs": [],
      "execution_count": 37,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import time\n",
        "\n",
        "start = time.time()\n",
        "\n",
        "sess = tf.Session()\n",
        "sess.run(tf.global_variables_initializer())\n",
        "\n",
        "for epoch in range(n_epoches):\n",
        "    sess.run(train_init)\n",
        "    try:\n",
        "        # Loop until all elements have been consumed\n",
        "        while True:\n",
        "            sess.run(optimizer)\n",
        "    except tf.errors.OutOfRangeError:\n",
        "        pass\n",
        "\nend = time.time()"
      ],
      "outputs": [],
      "execution_count": 39,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "w_curr, b_curr = sess.run([w,b])\n",
        "y_pred_train = w_curr * train_d[:,0] + b_curr\n",
        "y_pred_test = w_curr * test_d[:,0] + b_curr\n",
        "\n",
        "r2_train = R_squared(train_d[:,1], y_pred_train)\n",
        "r2_test = R_squared(test_d[:,1], y_pred_test)"
      ],
      "outputs": [],
      "execution_count": 40,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "print('R^2_train:', sess.run(r2_train))\n",
        "print('R^2_test:', sess.run(r2_test))\n",
        "print('elapsed time:', end - start)\n",
        "sess.close()"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "R^2_train: 0.99873245\n",
            "R^2_test: 0.9987029\n",
            "elapsed time: 85.28967356681824\n"
          ]
        }
      ],
      "execution_count": 41,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [
        "plt.scatter(test_d[:,0], test_d[:,1], label='Real Data')\n",
        "plt.plot(test_d[:,0], y_pred_test, 'r', label='Predicted Data')\n",
        "plt.xlabel('Independent Variable') \n",
        "plt.ylabel('Dependent Variable')\n",
        "plt.legend()"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 43,
          "data": {
            "text/plain": [
              "<matplotlib.legend.Legend at 0x1e07efc3940>"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": [
              "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\n"
            ],
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {}
        }
      ],
      "execution_count": 43,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    }
  ],
  "metadata": {
    "kernel_info": {
      "name": "python3"
    },
    "language_info": {
      "pygments_lexer": "ipython3",
      "file_extension": ".py",
      "codemirror_mode": {
        "version": 3,
        "name": "ipython"
      },
      "mimetype": "text/x-python",
      "name": "python",
      "version": "3.5.5",
      "nbconvert_exporter": "python"
    },
    "kernelspec": {
      "name": "python3",
      "language": "python",
      "display_name": "Python 3"
    },
    "nteract": {
      "version": "0.12.2"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}